package com.jishuo.pzk.job;

import com.jishuo.base.util.GTimeUtil;
import com.jishuo.pzk.service.PzkService;
import com.jishuo.pzk.service.PzmessageService;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 定时任务
 * lockAtLeastFor，保留锁的最短时间。主要目的是在任务非常短的且节点之间存在时钟差异的情况下防止多个节点执行。
 * 这个属性是锁的持有时间。设置了多少就一定会持有多长时间，在此期间，下一次任务执行时，其他节点包括它本身是不会执行任务的。
 * lockAtMostFor，在执行节点死亡时应保留锁的时间。这只是一个后备，在正常情况下，锁定会在任务完成后立即释放。
 */
@Component
@Slf4j
public class TaskJob {
    @Resource
    private PzkService pzkService;
    @Resource
    private PzmessageService pzmessageService;

    /**
     * 定时画图，每日凌晨执行一次
     */
    @Scheduled(cron = "${task.drawPzK:-}")
    @SchedulerLock(name = "Task-DrawPzk", lockAtLeastFor = "PT8M", lockAtMostFor = "PT1H")
    public void drawPzK() {
        log.info("【绘制凭证】开始执行，{}", GTimeUtil.getDateTimeMark());
        long n = System.currentTimeMillis();

        pzkService.draw();

        n = (System.currentTimeMillis() - n) / 1000;
        log.info("【绘制凭证】执行完毕，耗时{}秒，{}", n, GTimeUtil.getDateTimeMark());
    }

    /**
     * 导入数据，从1点开始执行到21点，没两小时调动一次
     */
    @Scheduled(cron = "${task.readData:-}")
    @SchedulerLock(name = "Task-readData", lockAtLeastFor = "PT8M", lockAtMostFor = "PT30M")
    public void readData() {
        log.info("【导入数据】开始执行，{}", GTimeUtil.getDateTimeMark());
        long n = System.currentTimeMillis();

        pzmessageService.impData();

        n = (System.currentTimeMillis() - n) / 1000;
        log.info("【导入数据】执行完毕，耗时{}秒，{}", n, GTimeUtil.getDateTimeMark());
    }
}
